package com.seeyon.ctp.rest.resources;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.apps.brwh.kit.DBKit;
import com.seeyon.apps.brwh.kit.HttpKit;
import com.seeyon.apps.brwh.kit.StrKit;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormDataMasterBean;
import com.seeyon.cap4.form.bean.FormDataSubBean;
import com.seeyon.cap4.form.service.CAP4FormManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.organization.manager.OrgManager;
import org.apache.commons.logging.Log;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.*;


@Path("jssdk")
@Produces({MediaType.APPLICATION_JSON})
public class CustomUpdateFormDataResources extends BaseResource {

    private static final Log log = CtpLogFactory.getLog(CustomUpdateFormDataResources.class);
    private String localAddr = AppContext.getRawRequest().getLocalAddr();
    private String port = String.valueOf(AppContext.getRawRequest().getLocalPort());
    private static final String userName = AppContext.getSystemProperty("brwh.restName");
    private static final String password = AppContext.getSystemProperty("brwh.restPassWord");
    private String tokenUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/token";
    private String bpmUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/bpm/workitem/finish";

    private CAP4FormManager cap4FormManager = (CAP4FormManager) AppContext.getBean("cap4FormManager");
    private OrgManager orgManager = (OrgManager) AppContext.getBean("orgManager");

    /**
     * 更新表单数据接口
     * 该方法用于更新特定表单的数据，主要针对销售报价单
     * 它接收一个JSON对象作为输入，其中包含需要更新的主表和子表数据
     * 主要逻辑包括：
     * 1. 从请求参数中解析出主表和子表需要更新的数据
     * 2. 根据解析的数据更新数据库中的记录
     * 3. 返回更新结果信息
     *
     * @param param 包含表单数据的JSON对象，其中包括主表和子表需要更新的数据
     * @return 返回一个Response对象，包含更新结果信息
     * @throws Exception 如果在数据更新过程中发生异常，则抛出此异常
     */
    @POST
    @Path("update/form/data")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response getOrganizationData(Map<String, Object> param) throws Exception {
        // 记录请求参数日志
        log.info("入参数据json：" + JSON.toJSONString(param));

        // 创建一个结果映射对象，用于存储和返回处理结果
        Map<String, Object> resultMap = new HashMap<String, Object>();

        try {
            // 根据表单代码获取表单定义信息
            FormBean formBean = cap4FormManager.getFormByFormCode("XSBJ_001");
            // 获取子表名称
            String subTableName = formBean.getFieldBeanByDisplay("产品名称-报价清单").getOwnerTableName();

            // 将请求参数转换为JSON对象
            JSONObject jsonObj = new JSONObject(param);

            // 初始化主表数据对象
            FormDataMasterBean formDataMasterBean = null;

            // 如果请求参数中包含主表数据，则进行处理
            if (jsonObj.containsKey("main")) {
                // 获取主表数据对象
                JSONObject mainObj = jsonObj.getJSONObject("main");
                // 获取主表数据的ID
                String mainId = StrKit.str(mainObj.get("id"));

                // 如果主表数据ID为空，则返回错误信息
                if ("".equals(mainId)) {
                    resultMap.put("type", "E");
                    resultMap.put("msg", "主表数据ID不能为空值!");
                    return ok(resultMap);
                }

                // 根据主表数据ID获取主表数据对象
                formDataMasterBean = cap4FormManager.getDataMasterBeanById(Long.parseLong(mainId), formBean, null);
                // 更新主表数据对象的字段值
                for (Map.Entry<String, Object> entry : mainObj.entrySet()) {
                    formDataMasterBean.addFieldValue(entry.getKey(), StrKit.str(entry.getValue()));
                }
            }

            // 获取子表数据对象列表
            List<FormDataSubBean> formDataSubBeans = formDataMasterBean.getSubData(subTableName);

            // 如果请求参数中包含子表数据，则进行处理
            if (jsonObj.containsKey("sub")) {
                // 获取子表数据数组
                JSONArray sub_array = jsonObj.getJSONArray("sub");

                // 遍历子表数据数组，更新子表数据
                for (int i = 0; i < sub_array.size(); i++) {
                    JSONObject subObj = sub_array.getJSONObject(i);
                    String subId = StrKit.str(subObj.get("sub_id"));

                    // 如果子表数据ID为空，则返回错误信息
                    if ("".equals(subId)) {
                        resultMap.put("type", "E");
                        resultMap.put("msg", "明细行数据ID不能为空值!");
                        return ok(resultMap);
                    }

                    // 更新子表数据对象的字段值
                    for (FormDataSubBean formDataSubBean : formDataSubBeans) {
                        String sub_id = StrKit.str(formDataSubBean.getId());
                        if (sub_id.equals(subId)) {
                            for (Map.Entry<String, Object> entry : subObj.entrySet()) {
                                formDataSubBean.addFieldValue(entry.getKey(), StrKit.str(entry.getValue()));
                            }
                        }
                    }
                }
            }

            formDataMasterBean.addFieldValue(formBean.getFieldBeanByDisplay("运营系统推送标识").getName(), "已推送");
            // 保存或更新表单数据
            cap4FormManager.saveOrUpdateFormData(formDataMasterBean, formBean.getId(), true, null);
            String sql = "select sub_object_id,member_id from ctp_affair where FORM_RECORDID = '" + formDataMasterBean.getId() + "' AND STATE = '3'";
            List<Map<String, Object>> dataList = DBKit.excuteSQL(sql, null);
            if (!dataList.isEmpty()) {
                String member_id = StrKit.str(dataList.get(0).get("member_id"));
                String loginName = orgManager.getMemberById(Long.parseLong(member_id)).getLoginName();
                Map<String, Object> tokenMap = new HashMap<String, Object>();
                tokenMap.put("userName", userName);
                tokenMap.put("loginName", loginName);
                tokenMap.put("password", password);
                String tokenJson = JSON.toJSONString(tokenMap);
                String token_result = HttpKit.post(tokenUrl, new HashMap<String, Object>(), tokenJson);
                String tokenId = "";
                try {
                    JSONObject token_obj = JSONObject.parseObject(token_result);
                    tokenId = StrKit.str(token_obj.get("id"));
                } catch (JSONException e) {
                }
                Map<String, Object> paramMap = new HashMap<String, Object>();
                paramMap.put("appName", "collaboration");
                String sub_object_id = StrKit.str(dataList.get(0).get("sub_object_id"));
                paramMap.put("workitemId", sub_object_id);
                Map<String, Object> dataMap = new HashMap<String, Object>();
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("attitude", "2");
                dataMap.put("comment_deal", map);
                paramMap.put("data", dataMap);
                Map<String, Object> header = new HashMap<String, Object>();
                header.put("token", tokenId);
                String result = HttpKit.post(bpmUrl, header, JSON.toJSONString(paramMap));
                log.info("自动审批流程返回信息:" + result);
            }
            // 返回成功信息
            resultMap.put("type", "S");
            resultMap.put("msg", "数据更新成功!");
            return ok(resultMap);
        } catch (Exception e) {
            // 记录错误日志
            log.error("更新销售报价单数据异常信息：", e);

            // 返回错误信息
            resultMap.put("type", "E");
            resultMap.put("msg", e.getMessage());
            return ok(resultMap);
        }
    }


}
